package cn.mall.auth.service.impl;/**
 * @author shkstart
 * @create 2023-11-30 12:26
 */

import cn.mall.auth.dto.LoginDTO;
import cn.mall.auth.dto.RegisterDTO;
import cn.mall.auth.service.ILoginService;
import cn.mall.base.constants.BaseConstants;
import cn.mall.base.utils.MD5Utils;
import cn.mall.org.domain.Manager;
import cn.mall.org.mapper.ManagerMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * @Auther:Jarvis
 * @Date:2023年11月2023/11/30日12:26
 * @Description:
 */
@Service
public class LoginServiceImpl implements ILoginService {

    @Autowired
    private ManagerMapper managerMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 后台登录
     * @param dto
     * @return
     */
    @Override
    public Map<String, Object> loginIn(LoginDTO dto) {
        // 判断用户名是否为空
        if (StringUtils.isEmpty(dto.getUsername()) || StringUtils.isEmpty(dto.getPassword())) {
            throw new RuntimeException("用户名或密码不能为空");
        }
        // 根据用户名查询数据库的用户信息
        Manager manager = managerMapper.loadByUsername(dto.getUsername());
        if (Objects.isNull(manager)) {
            throw new RuntimeException("用户名或密码错误");
        }
        // 校验用户名的密码是否正确
//        String md5Password = MD5Utils.encrypByMd5(manager.getSalt() + dto.getPassword() + "auth");
//        if (!md5Password.equals(manager.getPassword())) {
//            throw new RuntimeException("用户名或密码错误");
//        }

        if (manager.getDisable().equals(BaseConstants.AccountDisable.ACCOUNTDISABLE)){
            throw new RuntimeException("当前账号不可用");
        }


        Map<String, Object> authMap = new HashMap<>();
        // 通过UUID生成随即字符串作为key，用户信息作为value
        String token = UUID.randomUUID().toString();
        // 将信息存到 redis 中
        redisTemplate.opsForValue().set(token, manager, 12, TimeUnit.HOURS);
//        System.out.println(redisTemplate.opsForValue().get(token));
        // 登录成功，需要返回前端token和loginUser
        manager.setPassword("");
        manager.setSalt("");
        authMap.put("loginUser", manager);
        authMap.put("token", token);
        System.out.println(authMap);


        // 返回map
        return authMap;
    }

    /**
     * 后台管理员注册
     * @param dto
     */
    @Override
    public void managerRegister(RegisterDTO dto) {
        // 参数校验
        ParameterNonnullCheck(dto);

        // 密码加密 生成随机字符串盐值
        String salt = UUID.randomUUID().toString();
        String md5Password = MD5Utils.encrypByMd5(salt + dto.getPassword() + "auth");

        // 将信息存入 manager 表
        Manager manager = new Manager();
        manager.setUsername(dto.getUsername());
        manager.setPassword(md5Password);
        manager.setPhone(dto.getPhone());
        manager.setSalt(salt);
        manager.setCreatetime(new Date());
        manager.setType(BaseConstants.AuthAccountType.MANAGER_TYPE);
        manager.setDisable(BaseConstants.AccountDisable.ACCOUNTABLE);
        managerMapper.insert(manager);
    }

    /**
     * 参数非空校验
     * @param dto
     */
    public void ParameterNonnullCheck(RegisterDTO dto) {
        // 所有参数的非空校验
        if (StringUtils.isEmpty(dto.getPhone()) || StringUtils.isEmpty(dto.getUsername()) || StringUtils.isEmpty(dto.getPassword()) || StringUtils.isEmpty(dto.getConfirmPassword())) {
            throw new RuntimeException("请填写所有信息");
        }
        // 用户名查重
        Manager manager = managerMapper.loadByUsername(dto.getUsername());
        if (Objects.nonNull(manager)) {
            throw new RuntimeException("用户名已存在，请重新输入");
        }
        // 两次密码验证
        if (!dto.getPassword().trim().equals(dto.getConfirmPassword().trim())) {
            throw new RuntimeException("两次密码不一致，请重新输入");
        }
    }
}
